package modele;

import metier.TouchCase;
import metier.ValeurEnvoi;
import vue.JeuEchec;
import android.app.Activity;
import android.util.Log;
import android.view.View;

import com.example.finalprojet.R;

public class Echiquier {
	
	int Couleur;

	ValeurEnvoi val = new ValeurEnvoi(null, null);
	String posB[] = new String[16];				//Contient la position des pièces blanches
	String posN[] = new String[16];				//Contient la position des pièces noires
	String caseCoor[] = new String[64]; 				//Contient les noms des cases
	View imtab[] = new View[64];				//Tableau contenant les id de chacunes des cases
	View pBlanche[] = new View[16];				//Tableau contenant les id de chacunes des pièces blanches
	View pNoire[] = new View[16];				//Tableau contenant les id de chacunes des pièces noires
	Activity a;

	public Echiquier(int Couleur, Activity a) {
		this.Couleur = Couleur;
		this.a = a;
	}

	public void initCase() { //initialise les coordonnées des cases en fonction de la couleur du joueur
		imtab = initCaseRef();
		int n = 0;
		float l;
		l = a.getApplicationContext().getResources().getDisplayMetrics().heightPixels/8;
		float t = l/64f;
		for (int x = 1; x < 9; x++) {
			for (int y = 1; y < 9; y++) {
				if ( Couleur == JeuEchec.BLANC) {
					imtab[n].setScaleX(t);
					imtab[n].setScaleY(t);
					imtab[n].setX(l * (x - 1)+(t-1f)*32f);
					imtab[n].setY(l * (8 - y)+(t-1f)*32f);					
				} else {
					imtab[n].setScaleX(t);
					imtab[n].setScaleY(t);
					imtab[n].setX(l * (8 - x)+(t-1f)*32f);
					imtab[n].setY(l* (y - 1)+(t-1f)*32f);
				}
				n++;
			}
		}
	}

	public void initOnClickListener() {	//créé les listeners sur chaque case de l'echiquier
		String Case = null;
		int n = 0;
		for (char j = 'a'; j < 'i'; j++) {
			for (int i = 1; i < 9; i++) {
				Case = "" + j;
				Case += i;
				caseCoor[n] = Case;
				imtab[n].setOnClickListener(new TouchCase(Case, n, this));
				n++;
			}
		}
	}

	public void selectCase(String value, int n) { //effectue les actions et les affichages de selection à chaque interaction sur le listener
		String Coup = new String();
		Boolean couleur = false;
		for (int d = 0; d < 16 ; d++){   //test si la case selectionnée contient une pièce de la couleur du joueur, si oui, fixe le booléen 'couleur' à vrai
			if(Couleur == JeuEchec.BLANC){
				if(value.equalsIgnoreCase(posB[d])){
					couleur = true;
				}
			}
			else{
				if(value.equalsIgnoreCase(posN[d])){
					couleur = true;
				}
			}
		}
		if (val.getCase1() == value) { 	//si la case d'arrivée séléctionnée est identique à la case de départ alors on déséléctionne la pièce
			val.setCase1(null);
			imtab[n].setAlpha(1f);
		} else if (couleur){			//si la case séléctionnée contient une pièce de la couleur du joueur on la séléctionne ou bien on séléctionne la nouvelle pièce
			val.setCase1(value);
			for (int c = 0; c < 64; c++) {
				imtab[c].setAlpha(1f);
			}
			imtab[n].setAlpha(1f);
			for (int b = 0; b < 16; b++) {
				if (Couleur == JeuEchec.BLANC) {
					if (value.equalsIgnoreCase(posB[b])) {
						val.setCase1(value);
						imtab[n].setAlpha(0.625f);
					}
				}
				else{
					if (value.equalsIgnoreCase(posN[b])) {
						val.setCase1(value);
						imtab[n].setAlpha(0.625f);
					}
				}
			}
		} else if(val.getCase1() != null){	//si la deuxième case est une pièce adverse ou bien une case vide alors on déséléctionne et on effectue le mouvement
			for (int c = 0; c < 64; c++) {
				imtab[c].setAlpha(1f);
			}
			val.setCase2(value);
			Coup = val.getCase1() + val.getCase2();
			((JeuEchec)a).sendCoupToService(Coup);
			Mouvement(val, n, Couleur);
			val.setCase1(null);
			val.setCase2(null);
			// appel et reponse au serveur

		}
		
	}
	
	public void coupAdverse(Object coup){
		Log.e("RENTRE", "COUPADVERSE");
		ValeurEnvoi v = new ValeurEnvoi(null, null);
		if(coup instanceof String){
			Log.e("string", "string");
			v.setCase1(((String) coup).substring(0, 2));
			
			Log.e("1", ((String) coup).substring(0, 2));
			Log.e("2", ((String) coup).substring(2, 4));
			
			v.setCase2(((String) coup).substring(2, 4));
		} else if(coup instanceof ValeurEnvoi){
			Log.e("val", "val");
			v = (ValeurEnvoi) coup;
		}
		if(v.getCase1() != null && v.getCase2() != null){
			for(int i = 0; i<64 ; i++){
				if(v.getCase2().equalsIgnoreCase(caseCoor[i])){
					if(Couleur == JeuEchec.BLANC){
						Log.e("mvt", "noir");
						Mouvement(v, i, 0);
					}
					else{
						Log.e("mvt", "blanc");
						Mouvement(v, i, 1);
					}
				}
			}
		}
	}

	public void initPos() {
		pBlanche = initBlancRef();
		pNoire = initNoirRef();
		int n = 0;
		char lettreN;
		char lettreB;
		float l;
		l = a.getApplicationContext().getResources().getDisplayMetrics().heightPixels/8;
		float t = l/64f;
		for (int y = 1; y < 3; y++) {
			lettreN = 'h';
			lettreB = 'a';
			for (int x = 1; x < 9; x++) {
				if (Couleur == JeuEchec.BLANC) {
					pNoire[n].setScaleX(t);
					pNoire[n].setScaleY(t);
					pNoire[n].setX(l * (8 - x)+(t-1f)*32f);
					pNoire[n].setY(l * (y - 1)+(t-1f)*32f);
					pBlanche[n].setScaleX(t);
					pBlanche[n].setScaleY(t);
					pBlanche[n].setX(l * (x - 1)+(t-1f)*32f);
					pBlanche[n].setY(l * (8 - y)+(t-1f)*32f);
				} else {
					pBlanche[n].setScaleX(t);
					pBlanche[n].setScaleY(t);
					pBlanche[n].setX(l * (8 - x)+(t-1f)*32f);
					pBlanche[n].setY(l * (y - 1)+(t-1f)*32f);
					pNoire[n].setScaleX(t);
					pNoire[n].setScaleY(t);
					pNoire[n].setX(l * (x - 1)+(t-1f)*32f);
					pNoire[n].setY(l * (8 - y)+(t-1f)*32f);
				}
				posN[n] = "" + lettreN + (9 - y);
				posB[n] = "" + lettreB + y;
				lettreN--;
				lettreB++;
				n++;
			}
		}
	}

	public void Mouvement(ValeurEnvoi val, int n, int Couleur) {
		for (int i = 0; i < 16; i++) {
			if (Couleur == JeuEchec.BLANC) {
				if (posB[i].equalsIgnoreCase(val.getCase1())) {
					pBlanche[i].setX(imtab[n].getX());
					pBlanche[i].setY(imtab[n].getY());
					posB[i] = val.getCase2();
				}
				if (posN[i].equalsIgnoreCase(val.getCase2())) {
					pNoire[i].setAlpha(0f);
					posN[i] = posN[i] + "x";
				}
			} else {
				if (posN[i].equalsIgnoreCase(val.getCase1())) {
					pNoire[i].setX(imtab[n].getX());
					pNoire[i].setY(imtab[n].getY());
					posN[i] = val.getCase2();
				}
				if (posB[i].equalsIgnoreCase(val.getCase2())) {
					pBlanche[i].setAlpha(0f);
					posB[i] = posB[i] + "x";
				}
			}
		}

	}

	public View[] initBlancRef() {
		View[] btab = new View[16];
		btab[0] = a.findViewById(R.id.tb1);
		btab[1] = a.findViewById(R.id.cb1);
		btab[2] = a.findViewById(R.id.fb1);
		btab[3] = a.findViewById(R.id.db);
		btab[4] = a.findViewById(R.id.rb);
		btab[5] = a.findViewById(R.id.fb2);
		btab[6] = a.findViewById(R.id.cb2);
		btab[7] = a.findViewById(R.id.tb2);
		btab[8] = a.findViewById(R.id.pb1);
		btab[9] = a.findViewById(R.id.pb2);
		btab[10] = a.findViewById(R.id.pb3);
		btab[11] = a.findViewById(R.id.pb4);
		btab[12] = a.findViewById(R.id.pb5);
		btab[13] = a.findViewById(R.id.pb6);
		btab[14] = a.findViewById(R.id.pb7);
		btab[15] = a.findViewById(R.id.pb8);
		return btab;
	}

	public View[] initNoirRef() {
		View[] btab = new View[16];
		btab[0] = a.findViewById(R.id.tn1);
		btab[1] = a.findViewById(R.id.cn1);
		btab[2] = a.findViewById(R.id.fn1);
		btab[3] = a.findViewById(R.id.rn);
		btab[4] = a.findViewById(R.id.dn);
		btab[5] = a.findViewById(R.id.fn2);
		btab[6] = a.findViewById(R.id.cn2);
		btab[7] = a.findViewById(R.id.tn2);
		btab[8] = a.findViewById(R.id.pn1);
		btab[9] = a.findViewById(R.id.pn2);
		btab[10] = a.findViewById(R.id.pn3);
		btab[11] = a.findViewById(R.id.pn4);
		btab[12] = a.findViewById(R.id.pn5);
		btab[13] = a.findViewById(R.id.pn6);
		btab[14] = a.findViewById(R.id.pn7);
		btab[15] = a.findViewById(R.id.pn8);
		return btab;
	}

	public View[] initCaseRef() {
		View[] imtab = new View[64];
		imtab[0] = a.findViewById(R.id.a1);
		imtab[1] = a.findViewById(R.id.a2);
		imtab[2] = a.findViewById(R.id.a3);
		imtab[3] = a.findViewById(R.id.a4);
		imtab[4] = a.findViewById(R.id.a5);
		imtab[5] = a.findViewById(R.id.a6);
		imtab[6] = a.findViewById(R.id.a7);
		imtab[7] = a.findViewById(R.id.a8);
		imtab[8] = a.findViewById(R.id.b1);
		imtab[9] = a.findViewById(R.id.b2);
		imtab[10] = a.findViewById(R.id.b3);
		imtab[11] = a.findViewById(R.id.b4);
		imtab[12] = a.findViewById(R.id.b5);
		imtab[13] = a.findViewById(R.id.b6);
		imtab[14] = a.findViewById(R.id.b7);
		imtab[15] = a.findViewById(R.id.b8);
		imtab[16] = a.findViewById(R.id.c1);
		imtab[17] = a.findViewById(R.id.c2);
		imtab[18] = a.findViewById(R.id.c3);
		imtab[19] = a.findViewById(R.id.c4);
		imtab[20] = a.findViewById(R.id.c5);
		imtab[21] = a.findViewById(R.id.c6);
		imtab[22] = a.findViewById(R.id.c7);
		imtab[23] = a.findViewById(R.id.c8);
		imtab[24] = a.findViewById(R.id.d1);
		imtab[25] = a.findViewById(R.id.d2);
		imtab[26] = a.findViewById(R.id.d3);
		imtab[27] = a.findViewById(R.id.d4);
		imtab[28] = a.findViewById(R.id.d5);
		imtab[29] = a.findViewById(R.id.d6);
		imtab[30] = a.findViewById(R.id.d7);
		imtab[31] = a.findViewById(R.id.d8);
		imtab[32] = a.findViewById(R.id.e1);
		imtab[33] = a.findViewById(R.id.e2);
		imtab[34] = a.findViewById(R.id.e3);
		imtab[35] = a.findViewById(R.id.e4);
		imtab[36] = a.findViewById(R.id.e5);
		imtab[37] = a.findViewById(R.id.e6);
		imtab[38] = a.findViewById(R.id.e7);
		imtab[39] = a.findViewById(R.id.e8);
		imtab[40] = a.findViewById(R.id.f1);
		imtab[41] = a.findViewById(R.id.f2);
		imtab[42] = a.findViewById(R.id.f3);
		imtab[43] = a.findViewById(R.id.f4);
		imtab[44] = a.findViewById(R.id.f5);
		imtab[45] = a.findViewById(R.id.f6);
		imtab[46] = a.findViewById(R.id.f7);
		imtab[47] = a.findViewById(R.id.f8);
		imtab[48] = a.findViewById(R.id.g1);
		imtab[49] = a.findViewById(R.id.g2);
		imtab[50] = a.findViewById(R.id.g3);
		imtab[51] = a.findViewById(R.id.g4);
		imtab[52] = a.findViewById(R.id.g5);
		imtab[53] = a.findViewById(R.id.g6);
		imtab[54] = a.findViewById(R.id.g7);
		imtab[55] = a.findViewById(R.id.g8);
		imtab[56] = a.findViewById(R.id.h1);
		imtab[57] = a.findViewById(R.id.h2);
		imtab[58] = a.findViewById(R.id.h3);
		imtab[59] = a.findViewById(R.id.h4);
		imtab[60] = a.findViewById(R.id.h5);
		imtab[61] = a.findViewById(R.id.h6);
		imtab[62] = a.findViewById(R.id.h7);
		imtab[63] = a.findViewById(R.id.h8);
		return imtab;
	}
}
